查看原文
其他

实战系列之Node.js玩转Java

王澍 大转转FE 2019-11-13

这些年以来,Node.js的兴起,JavaScript已经从当年的“世界最被误解的语言”变成了“世界最流行的语言”。且其发展之势,从语言本身的进化,库和包的增长,工具支持的完善,star项目和领域解决方案的涌现,平台、技术栈、应用领域的扩张等诸方面来看,都是前所未见的。随着 Node.js服务的普及,对于后端服务是Java的公司就会产生一个问题, Node.js如何与 Java通讯呢?

今天讲什么?

我们抛开架构设计,抛开传统的 http、 socket、 rpc通讯协议,我们聊一聊在 Node.js应用里如何连接 JavaAPI,换句话来说就是在 Node.js里直接写 Java代码。

node-java

Node.js想要和 Java连接,需要一个 node-java 模块。

环境准备

操作系统:支持 OSX,Linux

运行环境(建议选择):

  • 安装模块

    • Nodejs LTS 版本 最低要求 6.x

    • java JDK 1.8+

    • Liunx gcc 4.8.1+

  1. $ npm install java

Liunx如果不支持 c++ 11 需要手动升级 gcc 到 gcc 4.8.) 参考地址

如果是 Mac 提示:显示需要安装旧Java SE 6运行环境才能打开,请下载JDK 2015

Node.js 调用 Java

HelloWorld

  • java

  1. public class HelloWorld {

  2.  public static void main(String[] args) {

  3.      System.out.println("Hello World!");

  4.  }

  5. }

输出: Hello World!

  • Node.js

  1. const java = require('java')

  2. const javaLangSystem = java.import('java.lang.System')

  3. javaLangSystem.out.printlnSync('Hello World!')

输出: Hello World!

操作Java Map

java 操作 HashMap

  1. import java.util.HashMap;

  2. import java.util.Map;

  3. public class HashMapDemo {

  4.  public static void main(String[] args) {

  5.    Map<String, Object> map = new HashMap<>();

  6.    map.put("name", "SunilWang");

  7.    map.put("age", 20);

  8.    String name = (String) map.get("name");

  9.    int age = (int) map.get("age");

  10.    System.out.printf("name:%s", name);

  11.    System.out.println("");

  12.    System.out.printf("age:%d", age);

  13.  }

  14. }

输出: name:SunilWang age:20

Node.js 同步调用 java HashMap

  1. const java = require('java')

  2. const HashMap = java.import('java.util.HashMap')

  3. // 同步操作

  4. let hashMap = new HashMap()

  5. hashMap.putSync('name', 'SunilWang')

  6. hashMap.putSync('age', 20)

  7. let name = hashMap.getSync('name')

  8. let age = hashMap.getSync('age')

  9. console.log('name', name)

  10. console.log('age', age)

输出: name:SunilWang age:20

Node.js callback 调用 java HashMap

  1. const java = require('java')

  2. const HashMap = java.import('java.util.HashMap')

  3. // callback操作

  4. let hashMap = new HashMap()

  5. hashMap.put('name', 'SunilWang', (error, info) => {

  6.  if (error) console.log('put name Error: ', error)

  7.  hashMap.get('name', (error, name) => {

  8.    if (error) console.log('get name Error: ', error)

  9.    console.log('callback name:%s', name)

  10.  })

  11. })

输出: callback name:SunilWang

Node.js Promise调用 java HashMap

  1. const co = require('co')

  2. const java = require('java')

  3. // 当前配置一定要在顶部声明

  4. java.asyncOptions = {

  5.  syncSuffix: 'Sync', // 同步方法名后缀

  6.  asyncSuffix: '', // 异步方法名后缀

  7.  promiseSuffix: 'Promise', // Promise方法名后缀

  8.  promisify: require('bluebird').promisify // 依赖Promise的模块

  9. }

  10. // ==============

  11. const HashMap = java.import('java.util.HashMap')

  12. // Promise操作

  13. co(function * () {

  14.  let hashMap = new HashMap()

  15.  yield hashMap.putPromise('name', 'SunilWang')

  16.  yield hashMap.putPromise('age', '20')

  17.  let name = yield hashMap.getPromise('name')

  18.  let age = yield hashMap.getPromise('age')

  19.  console.log('name', name)

  20.  console.log('age', age)

  21. })

创建Java 实例两种方法

  • Java

  1. import java.util.ArrayList;

  2. import java.util.List;

  3. public class ArrayListDemo {

  4.  public static void main(String[] args) {

  5.    List<String> list1 = new ArrayList<>();

  6.    List<String> list2 = new ArrayList<>();

  7.    list1.add("item1");

  8.    list2.add("item1");

  9.    System.out.printf("size: %d", list1.size()); //2

  10.    System.out.println("");

  11.    // list1 equals list2: true

  12.    System.out.printf("list1 equals list2: %s", list1.equals(list2));

  13.  }

  14. }

newInstanceSync

  1. const java = require('java')

  2. let list1 = java.newInstanceSync('java.util.ArrayList')

  3. console.log(list1.sizeSync()) // 0

  4. list1.addSync('item1')

  5. console.log(list1.sizeSync()) // 1

import & new

  1. let ArrayList = java.import('java.util.ArrayList')

  2. let list2 = new ArrayList()

  3. list2.addSync('item1')

  4. let equalValue = list2.equalsSync(list1)

  5. console.log(equalValue)// true

其他操作

快速new 数据组

  • Java

  1. public class CharArrayDemo {

  2.  public static void main(String[] args) {

  3.    char [] charArray = "hello world\n".toCharArray();

  4.    // charArray length: 12

  5.    System.out.printf("charArray length: %d", charArray.length);

  6.  }

  7. }

  • Node.js

  1. let charArray = java.newArray('char', 'hello world\n'.split(''))

  2. // [ 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '\n' ]

  3. console.log(charArray.length) // 12

快速new Long对象

  • Java

  1. public class LongDemo {

  2.  public static void main(String[] args) {

  3.    Long num = new Long("5");

  4.    System.out.println(num);

  5.    System.out.println(num.longValue());

  6.  }

  7. }

  • Node.js

  1. let javaLong = java.newInstanceSync('java.lang.Long', 5)

  2. // Possibly truncated long value: 5

  3. console.log('Possibly truncated long value: %d', javaLong)

  4. // Original long value (as a string): 5

  5. console.log('Original long value (as a string): %s', javaLong.longValue)

Node.js 调用自己编译类

  • Java

  1. package com.nearinfinity.nodeJava;

  2. public class MyClass {

  3.  public static int addNumbers(int a, int b) {

  4.    return a + b;

  5.  }

  6. }

  • Node.js

  1. const java = require('java')

  2. java.classpath.push('./src')

  3. let MyClass = java.import('com.nearinfinity.nodeJava.MyClass')

  4. let result = MyClass.addNumbersSync(1, 2)

  5. console.log(result)

  6. let javaInteger = java.newInstanceSync('java.lang.Integer', 2)

  7. // 快速调用 Java 静态类里面的方法

  8. result = java.callStaticMethodSync('com.nearinfinity.nodeJava.MyClass', 'addNumbers', javaInteger, 3)

  9. console.log(result)

结束语

上述方法只是带你了解 node-java冰山一角, node-java API很丰富,如 jvm, 实例一个类, 调用类静态方法, 快速实例化一个对象等等。

最快的学习方式是看文档,文档地址:node-java 。


——————————————————

长按二维码,关注大转转FE


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存